package ia.programas.controlpc;

import java.io.IOException;

import ia.util.Connector;
import ia.util.CreadorPiloto;
import ia.util.Logger;

import javax.swing.UIManager;

import lejos.nxt.Motor;
import lejos.robotics.navigation.DifferentialPilot;

@SuppressWarnings("all")
/**
 * Control remoto version PC para Lego Mindstorm NXT
 *  
 * @author Armando Andini
 *
 */
public class ControlPC {
	
	//atributos
	private VentanaPrincipal ventana;
	private boolean conectado = false;
	private DifferentialPilot piloto;
	
	
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//setear el look and feel
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		}
		catch (Exception e){}
		
		//instanciar el control
		(new ControlPC()).iniciar();
		

	}
	
	
	public void iniciar(){
		ventana = new VentanaPrincipal(this);
		Connector.setLogger(Logger.getLogger(Logger.CONSOLE));
		ventana.fControlPC.setVisible(true);
		
	}
	
	public void conectar(){
		//chequear si ya estaba conectado
		if(conectado){
			ventana.log("Ya estas conectado!");
			return;
		}
		
		//intentar conectar
		ventana.log("Conectando..");
		Thread.yield();
		conectado = Connector.connectBT();
		if(conectado){
			ventana.log("Coneccion exitosa!");
			ventana.lEstado.setText("CONECTADO");
			piloto = CreadorPiloto.getPilot();
		}
		else{
			ventana.log("No se pudo conectar");
		}
	}
	
	public void desconectar(){
		//chequear si ya estaba desconectado
		if(!conectado){
			ventana.log("Ya estas desconectado!");
			return;
		}
		
		//desconectar
		ventana.log("Desconectando..");
		conectado = false;
		ventana.lEstado.setText("DESCONECTADO");
		try {
			Connector.disconnect();
		} catch (IOException e) {
			ventana.log(e.getMessage());
		}
	}
	
	public void rotar(float angulo){
		//chequear coneccion
		if(!chequearConectado())
			return;
		
		//girar
		ventana.log("Rotando "+angulo+" grados");
		piloto.rotate(angulo,true);
	}
	
	public void avanzar(float distancia){
		//chequear coneccion
		if(!chequearConectado())
			return;
		
		ventana.log("Avanzando "+distancia+" centimetros");
		piloto.travel(distancia,true);
	}
	
	public void cambiarAvance(float velAvance){
		//chequear coneccion
		if(!chequearConectado())
			return;
		
		ventana.log("Seteando velocidad de avance a "+velAvance+" cm/s");
		piloto.setTravelSpeed(velAvance);
	}
	
	public void cambiarRotacion(float velRotacion){
		//chequear coneccion
		if(!chequearConectado())
			return;
		
		ventana.log("Seteando velocidad de rotacion a "+velRotacion+" grados/s");
		piloto.setRotateSpeed(velRotacion);
	}
	
	/**
	 * varios metodos necesitan estar conectado, y de no estarlo informar el error. para eso este metodo
	 */
	public boolean chequearConectado(){
		if(!conectado){
			ventana.log("Necesitas estar conectado");
		}
		return conectado;
	}
	
	public void disparar(){
		//chequear coneccion
		if(!chequearConectado())
			return;
		Motor.B.rotate(360,true);
	}
	
	public void abrirVentanaMapa(){
		new ControlMapaTerreno(this);
	}

}
